home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Technotools
/
Technotools (Chestnut CD-ROM)(1993).ISO
/
lang_c
/
api_shar
/
sharea.c
< prev
next >
Wrap
Text File
|
1989-01-25
|
5KB
|
187 lines
/****************************************************************
*
* Name: SHAREA
*
* Function: share memory/data among multiple processes
*
* Shows how to: 1. allocate and deallocate shared memory.
* 2. read from and write to shared memory.
* 3. mail to another process the address of shared data.
* 4. control access to shared data via mailbox semaphore.
*
* Written by: Larry Rush, Quarterdeck Office Systems
*
* Contact: Voice: (213) 392-9851, (213) 392-9701
* BBS: (213) 396-3904, (213) 392-2278
* Fax: (213) 399-3802
*
****************************************************************/
#include <stdio.h>
#include "dvapi.h"
/* minimum API version required */
#define required 0x201
/* PIF-related constants */
#define PIFNAME "SHAREB.DVP"
#define PIFLEN 416
/* arbitrary # times to read/write shared memory */
#define REPS 4
/* API version number */
int version;
/* default object handle */
ulong win;
/* PIF-related variables */
FILE *fp,*fopen();
char dvpbuf[PIFLEN];
char pathbuf[64];
/* application handle of other process */
ulong apphanb;
/* read/write loop control variable */
int i;
/* type declarations related to shared data */
/* typedef int datatype; */
typedef char *datatype;
/*r* struct datatype { *r*/
/*r* struct datatype *link; *r*/
/*r* int lng; *r*/
/*r* char data[11]; *r*/
/*r* }; *r*/
/* type declaration of pointer to shared data */
/*i* typedef datatype *dataptr; *i*/
typedef datatype *dataptr;
/*r* typedef struct datatype *dataptr; *r*/
/* constant value to be assigned to shared memory */
/*i* datatype shrconst = 11111; *i*/
datatype shrconst = "AAAAA ";
/*r* struct datatype shrconst = { *r*/
/*r* NULL, *r*/
/*r* 11111, *r*/
/*r* "AAAAA " *r*/
/*r* }; *r*/
/* pointer to shared data */
dataptr bufptr;
/* mailbox semaphore controlling access to shared memory */
ulong sema;
/* global name of mailbox semaphore */
char name[] = "Shared Memory Semaphore";
/**********************************************************************
* main - check for DESQview present and enable required extensions.
***********************************************************************/
main () {
/* initialize C interfaces and get API version number */
version = api_init();
/* if DESQview is not running or version is too low, display a message */
if (version < required) {
printf ("This program requires DESQview version %d.02%d or later.\n",
required/256,required%256);
}
else {
/* tell DESQview what extensions to enable and start application */
api_level (required);
program_body();
/* disable C interfaces and return from program */
api_exit();
}
}
/********************************************************************
* program_body - read, display and modify contents of shared data.
********************************************************************/
program_body () {
/* get object handle */
win = win_me();
/* create & name mailbox semaphore */
sema = mal_new();
mal_name (sema,name,sizeof (name));
/* read other process' dvp file into buffer area */
fp = fopen (PIFNAME,"rb");
fread (dvpbuf,PIFLEN,1,fp);
fclose (fp);
/* move current drive/path into DVP buffer */
getcwd (pathbuf,64);
dvpbuf[100] = pathbuf[0];
strcpy (&dvpbuf[101],&pathbuf[2]);
/* start other process & get its task handle */
apphanb = app_start (dvpbuf,PIFLEN);
/* allocate shared memory & get its buffer pointer */
/*i* bufptr = (dataptr) api_getmem (sizeof (datatype)); *i*/
bufptr = (dataptr) api_getmem (sizeof (datatype));
/*r* bufptr = (dataptr) api_getmem (sizeof (struct datatype)); *r*/
/* copy initial data into shared memory */
/*i* *bufptr = shrconst; *i*/
strcpy (bufptr,shrconst);
/*r* bufptr->lng = shrconst.lng; *r*/
/*r* strcpy (bufptr->data,shrconst.data); *r*/
/* mail to other process the pointer to shared data */
mal_write (mal_of (apphanb),&bufptr,4);
/* disallow closing of window */
win_disallow (win,ALW_CLOSE);
/* loop till handle of other process is no longer valid */
while (api_isobj (apphanb)) {
/* lock semaphore */
mal_lock (sema);
/* loop REPS times */
for (i = 1; i <= REPS; i++) {
/* read & display current contents & address of shared data */
/*i* win_printf (win,"%i at %Fp\n",*bufptr,bufptr); *i*/
win_printf (win,"%s at %Fp\n",bufptr,bufptr);
/*r* win_printf (win,"%i %s at %Fp\n",bufptr->lng,bufptr->data,bufptr); *r*/
/* modify contents of shared data */
/*i* *bufptr = shrconst; *i*/
strcpy (bufptr,shrconst);
/*r* bufptr->lng = shrconst.lng; *r*/
/*r* strcpy (bufptr->data,shrconst.data); *r*/
}
/* unlock semaphore */
mal_unlock (sema);
}
/* allow closing of window */
win_allow (win,ALW_CLOSE);
/* free allocated shared memory */
api_putmem (bufptr);
/* free allocated object */
mal_free (sema);
}